package com.zhongan.cglib.demo;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;

public class CglibProxy implements MethodInterceptor {

    @SuppressWarnings("rawtypes")
    public Object getProxy(Class clazz) {
        Enhancer enhancer = new Enhancer();
        // 生成指定对象的子类，重写类中的业务函数，在重写中加入intercep（）函数
        enhancer.setSuperclass(clazz);
        // 设置回调，应该就是回调哪个拦截器
        // enhancer.setCallback(this);
        // 可设置多个intercept
        // NoOp.INSTANCE是CGLIB所提供的一个没有任何操作的拦截器，拦截器是由顺序的，一定要和CallbackFilter里面的顺序一致，Filter中的0/1就是返回的顺序，也就是说function方法将执行1过滤，也就是INSTANCE过滤器
        enhancer.setCallbacks(new Callback[] { this, NoOp.INSTANCE });
        enhancer.setCallbackFilter(new CglibProxyFilter());
        // return enhancer.create();
        return enhancer.create(new Class[] {String.class}, new Object[] { "kaic" });
    }

    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        System.out.println(arg1.getName() + ", before");
        Object result = arg3.invokeSuper(arg0, arg2);
        System.out.println(arg1.getName() + ", after");
        return result;
    }

}
